<?php
declare (strict_types=1);

// +----------------------------------------------------------------------
// | SCApi
// +----------------------------------------------------------------------
// | 版权所有 2021~2022 贾二小 [ http://www.ipsoul.com ]
// +----------------------------------------------------------------------
// | 官方网站: http://www.ipsoul.com
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// | 免费声明 ( http://doc.ipsoul.com/disclaimer )
// +----------------------------------------------------------------------
// | gitee 代码仓库：https://gitee.com/jiaerxiao/scapi
// | github 代码仓库：https://github.com/jiaerxiao/scapi
// +----------------------------------------------------------------------

// 应用公共文件

use think\helper\Str;

if (!function_exists('get_tree')) {
    /**
     * 将数据格式化成树形结构
     * @param $data
     * @param $pId
     * @return array
     * @author 贾二小
     * @since 2021/4/12
     */
    function get_tree($data, $pId): array
    {
        $tree = [];
        foreach ($data as $k => $v) {
            if ($v['parentId'] == $pId) {
                $v['children'] = get_tree($data, $v['id']);
                $tree[] = $v;
                unset($data[$k]);
            }
        }
        return $tree;
    }
}

if (!function_exists('get_token')) {
    /**
     * 获取唯一Token
     * @param string $userName 用户名
     * @return string
     * @author 贾二小
     * @since 2021/11/7
     */
    function get_token(string $userName): string
    {
        $str = md5(uniqid(md5(strval(microtime(true))), true));
        return sha1($str . $userName);
    }
}

if (!function_exists('to_camel')) {

    /**
     * 数组Key下划线转驼峰(首字母小写)
     * @param array $item 数组
     * @return array|false
     * @author 贾二小
     * @since 2021/7/4
     */
    function to_camel(array $item)
    {
        return array_combine(array_map(function ($key) {
            return Str::camel($key);
        }, array_keys($item)), $item);
    }
}

if (!function_exists('to_snake')) {

    /**
     * 数组Key驼峰转下划线(首字母小写)
     * @param array $item 数组
     * @author 贾二小
     * @since 2021/7/4
     */
    function to_snake(array $item)
    {
        return array_combine(array_map(function ($key) {
            return Str::snake($key);
        }, array_keys($item)), $item);
    }
}

if (!function_exists('map_to_snake')) {

    /**
     * 搜索条件驼峰转下划线(首字母小写)
     * @param array $map 搜索条件
     * @return array
     * @author 贾二小
     * @since 2021/7/4
     */
    function map_to_snake(array $map): array
    {
        return array_map(function ($item) {
            $item[0] = Str::snake($item[0]);
            return $item;
        }, $map);
    }
}

if (!function_exists('field_to_snake')) {

    /**
     * 查询字段驼峰转下划线(首字母小写)
     * @param array $field 字段条件
     * @return array
     * @author 贾二小
     * @since 2021/7/4
     */
    function field_to_snake(array $field): array
    {
        return array_map(function ($item) {
            return Str::snake($item);
        }, $field);
    }
}

if (!function_exists('to_camel_array')) {

    /**
     * 二维数组下划线转驼峰(首字母小写)
     * @param array $data 二维数组
     * @return array
     * @author 贾二小
     * @since 2021/7/26
     */
    function to_camel_array(array $data): array
    {
        return array_map(function ($item) {
            return to_camel($item);
        }, $data);
    }
}

if (!function_exists('to_snake_array')) {

    /**
     * 二维数组驼峰转下划线(首字母小写)
     * @param array $data 二维数组
     * @return array
     * @author 贾二小
     * @since 2021/7/26
     */
    function to_snake_array(array $data): array
    {
        return array_map(function ($item) {
            return to_snake($item);
        }, $data);
    }
}

if (!function_exists('current_date')) {

    /**
     * 获取当前日期
     * @param string $type 类型
     * @return string
     * @author 贾二小
     * @since 2021/7/4
     */
    function current_date(string $type = "dateTime"): string
    {
        if ($type == "dateTime") {
            return date('Y-m-d H:i:s');
        } elseif ($type == "time") {
            return date('H:i:s');
        } else {
            return date('Y-m-d');
        }
    }
}